{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Collaborative Filtering on Google Analytics Data\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Learning objectives\n",
    "1. Prepare the user-item matrix and use it with WALS.\n",
    "2. Train a `WALSMatrixFactorization` within TensorFlow locally and on AI Platform.\n",
    "3. Visualize the embedding vectors with principal components analysis.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overview\n",
    "This notebook demonstrates how to implement a WALS matrix refactorization approach to do collaborative filtering.\n",
    "\n",
    "Each learning objective will correspond to a __#TODO__ in the [student lab notebook](../labs/wals.ipynb) -- try to complete that notebook first before reviewing this solution notebook.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "PROJECT = \"cloud-training-demos\" # REPLACE WITH YOUR PROJECT ID\n",
    "BUCKET = \"cloud-training-demos-ml\" # REPLACE WITH YOUR BUCKET NAME\n",
    "REGION = \"us-central1\" # REPLACE WITH YOUR BUCKET REGION e.g. us-central1\n",
    "\n",
    "# Do not change these\n",
    "os.environ[\"PROJECT\"] = PROJECT\n",
    "os.environ[\"BUCKET\"] = BUCKET\n",
    "os.environ[\"REGION\"] = REGION\n",
    "os.environ[\"TFVERSION\"] = \"1.15\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Updated property [core/project].\n",
      "Updated property [compute/region].\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "gcloud config set project $PROJECT\n",
    "gcloud config set compute/region $REGION"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.15.5\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Create raw dataset\n",
    "<p>\n",
    "For collaborative filtering, you don't need to know anything about either the users or the content. Essentially, all you need to know is userId, itemId, and rating that the particular user gave the particular item.\n",
    "<p>\n",
    "In this case, you are working with newspaper articles. The company doesn't ask their users to rate the articles. However, you can use the time-spent on the page as a proxy for rating.\n",
    "<p>\n",
    "Normally, you would also add a time filter to this (\"latest 7 days\"), but your dataset is itself limited to a few days."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>visitorId</th>\n",
       "      <th>contentId</th>\n",
       "      <th>session_duration</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1012012094517511217-1</td>\n",
       "      <td>299949290</td>\n",
       "      <td>218676</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1614877438160481626-349</td>\n",
       "      <td>29455408</td>\n",
       "      <td>438692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1815317450115839569-235</td>\n",
       "      <td>299807267</td>\n",
       "      <td>160669</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1950053456137072413-10</td>\n",
       "      <td>243386345</td>\n",
       "      <td>102636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2179122255490468209-180</td>\n",
       "      <td>299925086</td>\n",
       "      <td>6041</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 visitorId  contentId  session_duration\n",
       "0    1012012094517511217-1  299949290            218676\n",
       "1  1614877438160481626-349   29455408            438692\n",
       "2  1815317450115839569-235  299807267            160669\n",
       "3   1950053456137072413-10  243386345            102636\n",
       "4  2179122255490468209-180  299925086              6041"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from google.cloud import bigquery\n",
    "bq = bigquery.Client(project = PROJECT)\n",
    "\n",
    "sql = \"\"\"\n",
    "WITH CTE_visitor_page_content AS (\n",
    "    SELECT\n",
    "        # Schema: https://support.google.com/analytics/answer/3437719?hl=en\n",
    "        # For a completely unique visit-session ID, you combine combination of fullVisitorId and visitNumber:\n",
    "        CONCAT(fullVisitorID,'-',CAST(visitNumber AS STRING)) AS visitorId,\n",
    "        (SELECT MAX(IF(index=10, value, NULL)) FROM UNNEST(hits.customDimensions)) AS latestContentId,  \n",
    "        (LEAD(hits.time, 1) OVER (PARTITION BY fullVisitorId ORDER BY hits.time ASC) - hits.time) AS session_duration \n",
    "    FROM\n",
    "        `cloud-training-demos.GA360_test.ga_sessions_sample`,   \n",
    "        UNNEST(hits) AS hits\n",
    "    WHERE \n",
    "        # only include hits on pages\n",
    "        hits.type = \"PAGE\"\n",
    "GROUP BY   \n",
    "        fullVisitorId,\n",
    "        visitNumber,\n",
    "        latestContentId,\n",
    "        hits.time )\n",
    "-- Aggregate web stats\n",
    "SELECT   \n",
    "    visitorId,\n",
    "    latestContentId as contentId,\n",
    "    SUM(session_duration) AS session_duration\n",
    "FROM\n",
    "    CTE_visitor_page_content\n",
    "WHERE\n",
    "    latestContentId IS NOT NULL \n",
    "GROUP BY\n",
    "    visitorId, \n",
    "    latestContentId\n",
    "HAVING \n",
    "    session_duration > 0\n",
    "\"\"\"\n",
    "\n",
    "df = bq.query(sql).to_dataframe()\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>session_duration</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>2.843430e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>1.247665e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2.311307e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.605050e+04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>5.624600e+04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.271425e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>7.690598e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       session_duration\n",
       "count      2.843430e+05\n",
       "mean       1.247665e+05\n",
       "std        2.311307e+05\n",
       "min        1.000000e+00\n",
       "25%        1.605050e+04\n",
       "50%        5.624600e+04\n",
       "75%        1.271425e+05\n",
       "max        7.690598e+06"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stats = df.describe()\n",
    "stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:ylabel='Frequency'>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAE8CAYAAAA2bUNTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdyUlEQVR4nO3df7RXdZ3v8edbQAmrYylTKhI2IEaAoEc07fojs/AaWdZMkrZWXS+Mt6ypVibVzK27VtP1trrzwyVTwxgx/VLUnJSRycZ7JX+EBiguIdBIKc7gHYnG449LIfq+f5yv3LPxwPmec75f9tmb52Mtlt/9+Z79+b43R87rfD77s/eOzESSJFXbQWUXIEmShs5AlySpBgx0SZJqwECXJKkGDHRJkmrAQJckqQZGll3AUBxxxBE5YcKEssuQJGm/WLNmzW8yc2xf71Uy0CNiDjBn4sSJrF69uuxyJEnaLyLiV3t7r5JT7pm5LDPnd3R0lF2KJEnDQiUDXZIkFRnokiTVQCXPoUuS4Pnnn6erq4vf/e53ZZeiFhs9ejTjxo1j1KhRTe9joEtSRXV1dfGqV72KCRMmEBFll6MWyUy2b99OV1cXxx57bNP7OeUuSRX1u9/9jsMPP9wwr5mI4PDDDx/wzIuBLkkVZpjX02C+r5UM9IiYExGLuru7yy5FkqRhoZLn0DNzGbCss7NzXtm1SNJwMWHBbS3tb/NV57e0v2Zt3bqVT3ziE9x0001t6X/JkiWsXr2aa665piX9feUrX+Hzn//87u3TTjuNn/70py3peyAqOUKXJNXXUUcd1bYwH4wXXnhhn+9/5StfKWyXEeZgoBdMWHBb4Y8kad+ee+45zj//fE444QSmTp3K0qVLWbNmDWeeeSYnnXQS73znO3niiScAuPrqq5kyZQrTp0/noosuAuAnP/kJM2bMYMaMGcycOZNnnnmGzZs3M3XqVKBn4d9HPvIRpk2bxsyZM7nzzjuBnlH2hRdeyOzZs5k0aRKf/exn91nnt771LY477jjOPPNM7r333t3tH/7whwu/PLzyla8EYMWKFZx99tl88IMfZNq0aQC85z3v4aSTTuLNb34zixYtAmDBggXs2LGDGTNmcPHFFxf6yEyuuOIKpk6dyrRp01i6dOnuvs866yze//73c/zxx3PxxReTmUP4LvSo5JS7JGl4+NGPfsRRRx3Fbbf1DIK6u7s577zzuOWWWxg7dixLly7lC1/4AosXL+aqq67i8ccf55BDDuGpp54C4Gtf+xoLFy7k9NNP59lnn2X06NGF/hcuXAjAww8/zMaNG3nHO97Bo48+CsDatWt58MEHOeSQQ5g8eTIf//jHOeaYY15W4xNPPMEXv/hF1qxZQ0dHB2effTYzZ87s99h+9rOfsW7dut2Xji1evJjXvva17Nixg5NPPpn3ve99XHXVVVxzzTWsXbv2ZfvffPPNrF27loceeojf/OY3nHzyyZxxxhkAPPjgg6xfv56jjjqK008/nXvvvZe3vvWtzf2l74UjdEnSoE2bNo077riDK6+8krvvvpstW7awbt06zj33XGbMmMGXv/xlurq6AJg+fToXX3wx3/3udxk5smc8efrpp/PpT3+aq6++mqeeemp3+0vuuecePvShDwFw/PHH84Y3vGF3oJ9zzjl0dHQwevRopkyZwq9+1fdzS+6//37OOussxo4dy8EHH8wHPvCBpo5t1qxZhevAr776ak444QROPfVUtmzZwi9+8Yt97n/PPfcwd+5cRowYwete9zrOPPNMVq1atbvvcePGcdBBBzFjxgw2b97cVE37YqBLkgbtuOOOY82aNUybNo3Pfe5z/OAHP+DNb34za9euZe3atTz88MP8+Mc/BuC2227jYx/7GGvWrOGkk05i165dLFiwgGuvvZYdO3Zw6qmnsnHjxkL/+5qKPuSQQ3a/HjFiBLt27drr1+7tMrCRI0fy4osv7v6snTt37n7v0EMP3f16xYoV3HHHHaxcuZKHHnqImTNn9nudeKtqb5aBLkkatK1btzJmzBguueQSPvOZz3D//fezbds2Vq5cCfTcnnb9+vW8+OKLbNmyhbPPPpuvfvWrPPXUUzz77LP88pe/ZNq0aVx55ZV0dna+LNDPOOMMvve97wHw6KOP8utf/5rJkycPqMZTTjmFFStWsH37dp5//nluvPHG3e9NmDCBNWvWAHDLLbfw/PPP99lHd3c3r3nNaxgzZgwbN27kvvvu2/3eqFGj+tzvjDPOYOnSpbzwwgts27aNu+66i1mzZg2o9oHwHLok1UQZl5k9/PDDXHHFFRx00EGMGjWKr3/964wcOZJPfOITdHd3s2vXLj75yU9y3HHHcckll9Dd3U1m8qlPfYrDDjuMP//zP+fOO+9kxIgRTJky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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df[[\"session_duration\"]].plot(kind=\"hist\", logy=True, bins=100, figsize=[8,5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:ylabel='Frequency'>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# The rating is the session_duration scaled to be in the range 0-1.  This will help with training.\n",
    "median = stats.loc[\"50%\", \"session_duration\"]\n",
    "df[\"rating\"] = 0.3 * df[\"session_duration\"] / median\n",
    "df.loc[df[\"rating\"] > 1, \"rating\"] = 1\n",
    "df[[\"rating\"]].plot(kind=\"hist\", logy=True, bins=100, figsize=[8,5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "del df[\"session_duration\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "%%bash\n",
    "rm -rf data\n",
    "mkdir data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# TODO 1: Write object to a comma-separated values (csv) file.\n",
    "df.to_csv(path_or_buf = \"data/collab_raw.csv\", index = False, header = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1012012094517511217-1,299949290,1.0\n",
      "1614877438160481626-349,29455408,1.0\n",
      "1815317450115839569-235,299807267,0.8569622728727375\n",
      "1950053456137072413-10,243386345,0.5474309284215766\n",
      "2179122255490468209-180,299925086,0.03222095793478647\n",
      "2477455524323251766-1,299936493,0.3514756604914127\n",
      "277149937495438413-384,299777707,0.1444742737261316\n",
      "2912361176772133138-147,299796840,1.0\n",
      "3868650583032521586-577,299814183,0.5796732212068414\n",
      "4086929260756256102-380,299946732,1.0\n"
     ]
    }
   ],
   "source": [
    "!head data/collab_raw.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Create dataset for WALS\n",
    "<p>\n",
    "The raw dataset (above) won't work for WALS:\n",
    "<ol>\n",
    "<li> The userId and itemId have to be 0,1,2 ... so you need to create a mapping from visitorId (in the raw data) to userId and contentId (in the raw data) to itemId.\n",
    "<li> You will need to save the above mapping to a file because at prediction time, you'll need to know how to map the contentId in the table above to the itemId.\n",
    "<li> You'll need two files: a \"rows\" dataset where all the items for a particular user are listed; and a \"columns\" dataset where all the users for a particular item are listed.\n",
    "</ol>\n",
    "\n",
    "<p>\n",
    "\n",
    "### Mapping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "def create_mapping(values, filename):\n",
    "    with open(filename, 'w') as ofp:\n",
    "        value_to_id = {value:idx for idx, value in enumerate(values.unique())}\n",
    "        for value, idx in value_to_id.items():\n",
    "            ofp.write(\"{},{}\\n\".format(value, idx))\n",
    "    return value_to_id\n",
    "\n",
    "df = pd.read_csv(filepath_or_buffer = \"data/collab_raw.csv\",\n",
    "                 header = None,\n",
    "                 names = [\"visitorId\", \"contentId\", \"rating\"],\n",
    "                dtype = {\"visitorId\": str, \"contentId\": str, \"rating\": np.float})\n",
    "df.to_csv(path_or_buf = \"data/collab_raw.csv\", index = False, header = False)\n",
    "user_mapping = create_mapping(df[\"visitorId\"], \"data/users.csv\")\n",
    "item_mapping = create_mapping(df[\"contentId\"], \"data/items.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==> data/collab_raw.csv <==\n",
      "1012012094517511217-1,299949290,1.0\n",
      "1614877438160481626-349,29455408,1.0\n",
      "1815317450115839569-235,299807267,0.8569622728727375\n",
      "\n",
      "==> data/items.csv <==\n",
      "299949290,0\n",
      "29455408,1\n",
      "299807267,2\n",
      "\n",
      "==> data/users.csv <==\n",
      "1012012094517511217-1,0\n",
      "1614877438160481626-349,1\n",
      "1815317450115839569-235,2\n"
     ]
    }
   ],
   "source": [
    "!head -3 data/*.csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "df[\"userId\"] = df[\"visitorId\"].map(user_mapping.get)\n",
    "df[\"itemId\"] = df[\"contentId\"].map(item_mapping.get)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userId</th>\n",
       "      <th>itemId</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.856962</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>0.547431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>0.032221</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   userId  itemId    rating\n",
       "0       0       0  1.000000\n",
       "1       1       1  1.000000\n",
       "2       2       2  0.856962\n",
       "3       3       3  0.547431\n",
       "4       4       4  0.032221"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mapped_df = df[[\"userId\", \"itemId\", \"rating\"]]\n",
    "mapped_df.to_csv(path_or_buf = \"data/collab_mapped.csv\", index = False, header = False)\n",
    "mapped_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Creating rows and columns datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userId</th>\n",
       "      <th>itemId</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.856962</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>0.547431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>0.032221</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   userId  itemId    rating\n",
       "0       0       0  1.000000\n",
       "1       1       1  1.000000\n",
       "2       2       2  0.856962\n",
       "3       3       3  0.547431\n",
       "4       4       4  0.032221"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "mapped_df = pd.read_csv(filepath_or_buffer = \"data/collab_mapped.csv\", header = None, names = [\"userId\", \"itemId\", \"rating\"])\n",
    "mapped_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5662 items, 120983 users, 284343 interactions\n"
     ]
    }
   ],
   "source": [
    "NITEMS = np.max(mapped_df[\"itemId\"]) + 1\n",
    "NUSERS = np.max(mapped_df[\"userId\"]) + 1\n",
    "mapped_df[\"rating\"] = np.round(mapped_df[\"rating\"].values, 2)\n",
    "print(\"{} items, {} users, {} interactions\".format( NITEMS, NUSERS, len(mapped_df) ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 [    0   357   561   608   746  1119  1159  1207  1315  1348  1370  1396\n",
      "  1940  2035  2143  2254  3169  3313   176  3692   611  4003  4528  1432\n",
      "  4625  4862  4879  5110  5324  5409  5506  5693  5732  5743  5838   491\n",
      "  7167  7349  7908  7919  8064  8217  5758  8764  8829  9050  9140  9311\n",
      "  9417  9820 10368 10418 10809 10822 10911 11351 11761  9110 11982  3345\n",
      " 12292 12599 12841 12863 13342 13758 13986 14038 14153 14357 15069 15074\n",
      " 15106 15346 15424 15519 13030 16265 16363  5322 16416 16560 16749 17042\n",
      " 17077 17403 17442  6664 17575 17674 17735 17916 17990 18152 18181 13354\n",
      " 18383 18532 16206 13652 18643 18905 11473 19213 19655 19685 19699 17437\n",
      " 19817  3948 20195 15545 20285 20733 20792 16549 21222  5923 21627 21796\n",
      " 12084 14759 22053 22116 22691  1287 22717 20511 23252 23446 23479  5683\n",
      " 23796 17283 24177 24348   810 10004 24800 25200 13567  1899  8200 25455\n",
      " 25570 25629 25806 25822 25870 25904 11926 26330 26598 26610 26751 26914\n",
      " 27307 28187  6666   579 28556 28604 28708 28731 28756 24762 28916 28966\n",
      " 29452 29521 11392 11503 29771 29829 29935 12012 30161 30496  3827 26662\n",
      " 30686 30746 17931 30809 13231 30980 20602 31324 31418 31621 31898  3034\n",
      " 31997   389 32253 32413 32502 12924 32719 32744 32817 32890 32929  5062\n",
      " 29483 33477 33528 14164 33617 33642 33703 33771 33834 34045 34066 34101\n",
      "  3455 28351  9561 34206 34522  4378 34789 34857 34994 35004  2160 35210\n",
      " 35447 35588 35605 35725 35815 35818 36006 36111 26557 24649 36384 26845\n",
      "  4605 22817 22916 37058 37093 37389 19517  9461 37818  6890 22314 37945\n",
      " 38436 33298 21167 38896 25831 19582 39375 39554 28739 32642 39832 40055\n",
      "  4750 40269 31276 40332 21443 11597   350 41247 41345 41441   918  4525\n",
      " 18200 25024 15950 40285  8029 42042  2197 11288  8735 30551   890 32677\n",
      " 43227 34610 43447 27111  1548 31044  1807 43717 21284 44031 11636  2802\n",
      " 44168 44245 21948 44417 12241  6776 45088 45172 38633 45347  2248 45488\n",
      " 45576  8867 45720 37552 35866 45944 46118 46227 41742 46690 46730  1973\n",
      " 46791 46843 46892 46937  5483 47006 29697 14330 47309 24170 47509 47611\n",
      " 47882  7307  4978 38715 43861 37051 48606 19146 35573  3092 30196 48951\n",
      " 49159 49214  4064 39936 41673 49432 49461 49488 10504 49776 11221 49973\n",
      " 50009  5664  6297 42753 22220 34315 15468 50756 38125 38223 50883 50957\n",
      " 25159 51131 51187 18763  5550 51564 17084 51793 39490 51911 44702 52123\n",
      " 52484  8354  8701 11873    46 53227 53297 15206 18026 15900 53759 53760\n",
      "  7810 53840 10923 53895 20950  5332 43946 54472 54477 54496  6715  4022\n",
      "  7296 54877 54980 30992 27101 55045 55085 41871 55100 48350  2392  8750\n",
      " 55727 55746  6746 55976 12697 12787 56230 56266 53648 31410 42156 56638\n",
      " 23987 57145 57182 41351 24499  4302  7263 18016 55019 40434  2871 28104\n",
      " 40941] [1.   0.19 0.93 0.55 0.4  0.54 0.   0.09 0.57 1.   0.36 0.43 0.37 0.44\n",
      " 0.57 0.03 0.08 0.02 0.16 0.36 0.07 0.72 0.87 0.04 0.64 0.69 0.05 0.4\n",
      " 0.14 0.03 0.06 0.36 0.6  0.03 0.07 0.01 0.6  0.56 0.36 0.75 0.36 1.\n",
      " 1.   0.16 0.58 1.   0.98 0.37 1.   0.92 0.45 0.49 0.47 1.   1.   0.19\n",
      " 0.01 0.09 0.07 0.27 0.34 0.21 0.01 0.01 0.91 0.57 0.28 0.92 0.02 0.65\n",
      " 0.25 0.87 0.46 1.   0.   1.   0.37 1.   0.53 1.   1.   0.42 0.1  1.\n",
      " 0.47 1.   1.   0.41 0.04 0.44 1.   0.34 0.81 0.56 0.32 0.04 0.25 0.03\n",
      " 0.73 1.   0.03 0.21 0.05 0.11 0.26 1.   0.67 1.   0.4  0.69 0.19 0.1\n",
      " 0.14 0.98 0.46 0.46 0.11 0.94 0.46 0.92 0.1  1.   0.39 1.   0.67 0.23\n",
      " 0.76 1.   1.   0.68 0.68 0.25 0.41 0.79 0.81 0.05 0.72 0.04 0.07 0.34\n",
      " 1.   0.61 0.32 1.   0.37 1.   0.81 0.41 0.78 0.39 0.02 0.27 0.91 1.\n",
      " 0.21 1.   0.19 1.   0.33 0.66 0.56 0.04 0.43 0.78 0.47 0.93 0.52 0.15\n",
      " 0.61 0.2  1.   0.45 0.03 0.48 0.09 0.44 0.14 0.14 0.01 0.05 0.01 0.52\n",
      " 0.36 0.07 1.   0.13 0.57 1.   1.   1.   0.74 0.63 0.02 0.03 0.17 0.63\n",
      " 0.54 0.02 0.72 0.07 0.43 1.   1.   0.01 0.62 0.05 1.   0.03 0.26 0.48\n",
      " 0.5  1.   0.46 0.3  0.14 0.57 0.51 0.75 0.8  0.01 0.02 0.6  1.   1.\n",
      " 0.08 0.48 1.   0.18 0.91 0.54 0.3  0.21 0.52 0.03 0.03 1.   0.06 0.46\n",
      " 0.05 0.47 0.42 0.32 0.13 0.25 0.95 0.04 0.92 1.   0.5  0.45 0.32 0.99\n",
      " 0.6  0.78 0.17 0.32 0.24 0.77 0.46 0.66 0.15 0.78 0.27 0.31 0.36 0.25\n",
      " 0.76 0.04 0.43 1.   0.43 0.26 0.63 0.78 0.62 0.48 0.48 1.   0.08 0.01\n",
      " 0.48 0.41 0.17 0.49 0.45 0.69 0.14 0.76 1.   1.   0.58 0.02 0.52 1.\n",
      " 0.87 0.03 0.08 0.73 0.03 0.   0.78 0.28 0.27 0.99 0.62 0.25 0.37 0.95\n",
      " 0.37 0.96 0.45 0.16 0.08 1.   0.24 0.   0.03 0.04 0.5  0.21 0.31 0.09\n",
      " 0.85 0.03 0.4  0.07 0.47 0.41 0.62 0.01 0.89 0.07 0.29 0.04 0.92 1.\n",
      " 0.16 0.04 0.6  0.27 0.57 0.15 0.56 0.93 0.28 1.   0.69 0.61 0.32 0.01\n",
      " 0.49 1.   0.07 0.72 0.28 1.   0.68 0.04 0.26 0.28 0.09 0.03 1.   0.78\n",
      " 1.   0.4  0.55 0.36 0.04 0.62 1.   0.5  0.12 1.   0.33 1.   0.46 0.05\n",
      " 0.09 0.67 0.72 0.49 1.   0.47 0.57 0.38 0.91 1.   0.01 0.41 0.04 1.\n",
      " 0.19 0.06 0.68 0.77 0.11 0.31 0.15 0.33 0.47 0.91 0.24 0.11 0.4  1.\n",
      " 0.64 0.11 1.   0.08 1.   0.6  0.04 0.34 0.38 0.26 1.   0.64 0.87 0.24\n",
      " 0.45 0.01 1.   1.   0.45 0.09 1.   0.43 0.03 0.47 0.8  0.41 0.44 0.14\n",
      " 0.49 0.31 0.54 0.02 0.09 0.68 0.12 0.14 0.63 0.3  0.76]\n",
      "1 [   1 2468] [1.  0.7]\n",
      "2 [    2  1102  1529  2209  2413  2581  3155  3185  3365  4460  4792  5042\n",
      "  5789  6980  6992  4111  7403  8052  8308  8340  8556  8895  8900  9868\n",
      " 10187 10376  7594 10775  8029 11270 11376 11448 11476 11694 12310   506\n",
      " 12741 13139 13329  7864  5291 14267 14268   252 14961 15235  7685 10716\n",
      " 17004 11878 17652 17680 18180 18217 18310  3300 19828 20221 20732 15562\n",
      "  1973 23535 14400 23824 23971 24335  3162 26143 26206 26495 26980 27012\n",
      "  2311 21946 28358 29211 29313 23310 11251 29759  8261 32172 32538 32573\n",
      " 32609 32652 33063 19200 33716 34004 34027 26366 34225  7478 34974  1822\n",
      " 29483 36061 36252 36515 37262 31746 37485 37525 38397 38712 39130 39311\n",
      " 39542 17502 40027  5166 37229 21481 11594 16836 21615 40891  9510 28679\n",
      " 41525 41646 32836 31141 41886 13820 21732 41299 10152  7790 43557 43733\n",
      " 45115 42408 14421  9141  9847 36258 46677 29794 25806 33827 21989 47656\n",
      " 34544 47983 48065 48113 36663  8812 48672 21872  4671 16359 49926 11663\n",
      "  3563 32327 50606  1237 50914 18245 51523 25907 12246 51978   935 52065\n",
      " 52407 48171 31205 19055 39118  2893 11765   576  7143 53514 43349 53634\n",
      " 39075 24216 54609 14269  2859 55690 56129 13214  2195  8700 40892  3061\n",
      " 57183 34328 57368 57392 57453 57577 24940 15854 51041 58076 44054] [0.86 0.41 0.47 0.05 0.51 0.66 0.38 0.35 0.34 1.   0.63 0.03 0.12 1.\n",
      " 0.08 0.14 0.09 0.4  0.29 0.12 0.58 0.36 0.29 1.   0.77 0.6  0.13 0.16\n",
      " 0.25 0.57 0.28 1.   0.67 0.36 0.65 1.   1.   0.66 1.   1.   0.83 0.02\n",
      " 0.04 0.53 0.35 0.5  1.   0.31 0.53 0.12 1.   1.   0.   0.21 0.37 0.07\n",
      " 0.26 0.05 1.   0.27 0.36 0.45 0.62 0.4  0.17 0.06 0.01 0.17 1.   0.15\n",
      " 0.06 0.49 0.02 0.08 0.87 0.7  1.   0.12 0.28 0.27 0.37 1.   1.   1.\n",
      " 1.   0.65 0.1  1.   1.   1.   0.09 0.26 0.34 0.64 0.63 0.23 0.41 0.17\n",
      " 0.02 0.43 0.15 0.23 0.3  0.77 1.   0.03 0.3  0.29 1.   0.03 0.03 0.02\n",
      " 0.63 0.02 0.47 0.88 0.17 1.   0.01 0.55 1.   1.   0.3  1.   0.18 0.08\n",
      " 1.   0.14 1.   0.26 1.   1.   0.3  0.12 0.05 0.46 0.44 0.72 0.01 0.09\n",
      " 0.12 0.08 0.96 0.29 1.   0.23 1.   0.28 0.13 0.7  1.   0.34 0.41 0.23\n",
      " 1.   0.17 0.46 0.1  0.33 0.21 1.   0.22 0.31 0.05 0.94 0.85 0.27 0.4\n",
      " 1.   0.63 1.   0.86 0.19 0.05 0.42 0.1  0.39 1.   1.   1.   0.26 0.11\n",
      " 0.25 0.66 0.85 0.22 1.   0.57 0.42 0.36 1.   0.01 1.   0.03 1.   0.21\n",
      " 0.5  1.   0.02 0.27 0.97 0.22 0.23]\n",
      "3 [    3   229   900  1536  1981  2145  3838  4953  5330  5621  5691  5812\n",
      "  2819  5912  4244  8307  8393  9131  9233  9502 10069  1583 11109  2172\n",
      " 11343 11523 11678  5900 11742 12195 12458 13794 14493 11849 15437 15626\n",
      " 16240 16306 17400 17487   943 19053 19166 19696 20219 20813 21088 14139\n",
      " 21438 21452  2769 14680 22111  1871 23358 18875 23458 23747   277 12870\n",
      " 15755 25332 25413 25429 23586 25680 25784 25950 26765 26787 25493 27777\n",
      " 27784  8781 28011 17464 17581  3867 29041 29193 30621 30648 31975  9890\n",
      " 15607 10167 34736 20722 35220 35542  9065  6254 35804 24425  1571  5514\n",
      " 37175 37571 38077 38505 38513 38626 38696  2380 38866 35728 26277 26306\n",
      " 39862 20435 40303 40561  9149  9816 20673 42241 23790 43064 28689 26975\n",
      " 17580  4789 29170 33382 45426 45521 19523   534 41264 46245 30931 40558\n",
      "  8763 45661 39787 17924 22876 48134  2196 48646 46138  4013 10587 49717\n",
      " 50057 50196 50482 50773 51551  9846 52286 52329 52691 11639  2848 52949\n",
      " 45879 39435 53681 16032 54144 54364  3390 54672  9912 22638 42022  8134\n",
      " 23284 21698  6364 14871  1254 34824 25050 56524 56637 14496 57294  7553\n",
      " 57764 16540 58108] [0.55 0.75 0.2  0.   1.   0.45 0.08 1.   0.08 0.2  0.04 0.49 0.1  0.34\n",
      " 0.27 0.35 0.09 0.89 0.13 0.16 0.18 0.38 0.46 0.6  0.28 0.57 0.8  0.12\n",
      " 0.27 0.75 0.53 0.68 0.06 0.29 1.   0.15 0.68 0.63 0.44 1.   0.33 0.16\n",
      " 0.29 0.5  0.02 0.2  0.04 0.38 0.22 0.02 0.67 0.41 0.28 1.   1.   0.28\n",
      " 0.35 1.   0.61 0.54 0.15 0.24 0.5  0.37 0.38 0.4  1.   0.39 0.12 0.6\n",
      " 0.38 0.03 0.08 0.89 1.   0.37 0.23 0.39 0.02 0.18 0.33 0.24 0.85 0.73\n",
      " 1.   0.7  0.33 0.37 1.   0.6  1.   0.59 1.   1.   0.41 0.16 0.1  0.35\n",
      " 0.67 0.51 0.28 0.56 0.5  0.39 0.02 0.56 0.53 0.63 0.59 0.16 0.05 0.19\n",
      " 0.2  1.   0.32 0.7  0.78 0.12 0.05 0.43 0.51 0.37 0.5  0.14 1.   0.27\n",
      " 0.2  1.   0.92 0.07 0.04 0.41 0.03 0.55 0.31 0.07 0.47 1.   0.07 0.34\n",
      " 0.02 0.76 0.6  0.43 0.48 0.31 0.41 0.13 0.7  0.49 0.03 0.09 0.08 0.43\n",
      " 0.34 0.26 0.15 1.   0.13 0.41 1.   0.4  0.14 0.25 0.62 0.71 0.6  0.32\n",
      " 0.72 0.24 0.33 0.45 0.48 0.75 0.1  0.38 0.3  0.09 0.22 0.23 0.26 0.51\n",
      " 0.18]\n",
      "4 [    4    11   115   135   211   214   272   401   537   701   849   854\n",
      "   869  1427  1580  1589  1901  1993  2020  2054  2177  2488  2553  2583\n",
      "  2643  2674  2714  2969  3286  3641  3866  3875  3923  4016  4042  4379\n",
      "  4565  4708  4728  4836  4861  4943  5155  2113  5346  5438  5500  5526\n",
      "  5615  5645  5652  5837  5904  5910  6152  6242  6367  6714  6861  6886\n",
      "  6887  6967  6977  7086  7236  7399  7418  7448  7453  4791  4799  7841\n",
      "  7869  7880  7884  8073  8115  8255  8434  8509  8534  8581  8832  9135\n",
      "  6250  9251  9438  9559  6705  9806  9907  9980 10011 10150 10433 10520\n",
      " 10553 10667 10754  7999 10915 10966 11101 11110 11277 11303 11400  5622\n",
      " 11508 11683 11901  9207 12085 12144 12328 12436 12501 12518 12723  4094\n",
      "  1053  7192 12958 12976 13075 13079 13184  4610 13288 13394 13455 13527\n",
      " 13626 13637 13665 13718 14316 14329 14389 14395 14496 14565 14625 14691\n",
      " 14899 15044 15061 15134 15153 15208 15473 10234 15613 15696 15717 15737\n",
      " 15800 15811 15929 16227 16668 14256 17233 17308 17341 12287 17397 17413\n",
      " 17489 17667 12769 17890 17901 17972 15673 10383 18184 18229 18347  4851\n",
      " 18476  4928 18504 18818  8423 18961 19004  2694  8931 19323 19449  3197\n",
      "   148 19903 19932 20081 20169 20283 20325 20563 20650 13477 20791 20806\n",
      " 20863 21101 21127 21196 21366 21433 21460 21549 21612 21619 21849    67\n",
      " 22025 22059 22066 22085 22122 22138  6947 22427 22445 22607 22838 23093\n",
      " 16290 23375 23379 23614 23658 23687  5803 23739 24060 24150 12271 24229\n",
      " 24323   913   942 24783 24858 25041 25151 23081 25189 25247 25264 25340\n",
      " 25381 25452 25577  8711 25803 25838 14328 25846 25877  3069 26022 12009\n",
      "  9219 12066   145 26194 26202 26215 14814 12247 26338 26435 26489 26563\n",
      " 26597 26697 17807 26756 26813 26884  1468 18422 27243 18454 27293 27326\n",
      " 27409 18843  2486 27746  5698 27841  5757 11591  5938 28139 28293 28309\n",
      " 26286 14975 28469 12554 28546 28562 28595 28725 28788 28829 29026 29156\n",
      " 29217 27262 10875 29342 29407 29511 29605 29635 18938 29641 29654 29678\n",
      " 19058 29787 21486 29854 16939 29943 29955 29965 30246  6717 26496   847\n",
      " 30710 30752 30788 30914  5109 31306 11053 23383 31475 31480 31506  8460\n",
      "  2542 31653  5736 31697 31758 31816 31837 31893 17038 32028 26204 19643\n",
      " 32203 32324 26492 32406 32408  3941 26608  4020 32643 32793 15739  4711\n",
      " 10563 32971 32977 20602 33010  1611 33022  1674 33069 33095 33237  1975\n",
      " 23286 33365 33372 33511 33540 14140 29736 33600 33671 33708 33734 33745\n",
      " 33856 33934 33950 32081  3398 34078 34108  9509 34265  6885 28612 34385\n",
      " 34757 34801  1573 34894  1732 34983 10794 35006 31206  1879 35055 35113\n",
      " 27415  8146 35199 23409 35299 35415 35430 35464 35507  8881 35670 35693\n",
      " 35710 11918 35811 28226 35966 36155 36198 36243 10036 36318 28771 36331\n",
      " 36349  4406 10302 32805 36593 32980 36665 36679 34971 36768 33146 23172\n",
      " 36859  5148 10999 36892  5233 37025 37028 37046 37141 37186  2685 37337\n",
      " 37360  5905 19239  2912 37712 37763 19910 12556 37887 37899 37914 37923\n",
      " 37939 17724   978 38140 38236 38270 38351 38379 38385 34838 38491 33246\n",
      " 38709 11160 38803 16525 38942 38972 14234 39149  9073 39421 12282 39470\n",
      "   692 39643 38006 39730 39819 39884 15761 40024 40042 40128  4892 40251\n",
      " 40273 27460 40487 40693 40768 40771 40880 40917 40957 26185  3451 24322\n",
      " 41207 41210 41451 41461 12835 41615 41665 41775 41857 41879 41928 41965\n",
      " 27413 13747 42096 42211 27667 42492 42515 14447 42735 42792  9414 42853\n",
      " 42896 24473 43016 43125 12859 43275 43350 43401 10491 43866 43887 43952\n",
      " 44094 16871 44156 44185 40906 44341 39555   605 44619 44655 24577 44921\n",
      "  1466 43422 32979  1578  7923 45198 45216 45289 45373  8290 45637 45678\n",
      " 19258 45746  6060 45779 24010 45866 21997 17371 46297 46331 10232 46433\n",
      " 46473 46494 46495 46506 29102 22967  7777 46700 16404 46903 18946 47022\n",
      " 38954 47049 47080 47156 37401 19369 47429 47674 47761 47812 47864  7314\n",
      "  1280 48052 29125 31068  7806 48221 48270 13813 48393 11225  8328 48453\n",
      " 48471 48528 48578 48584  2658  9057  6440 48950 48966 32321 19919 49224\n",
      " 15438 49348 49364 49375 10342 49422 49474 49477 49485 15861 49516 49542\n",
      " 49556 31065 49741 49752 49892 49910 49914 18921 49986 50041 50312   100\n",
      "   193   209  3781 20160   983 50852 50956 50995 51129 51234 51275 51359\n",
      " 51424 35606 51568 11750 28162 51844 51845 51909 34248 51975 52018 52034\n",
      " 43088 26660 52110 52117 52156 15568 52262 52327  4740 10580 52415 52437\n",
      " 52453 52457 16263 52534 52607 25613 11392 27783 52753 14152  2790  2796\n",
      " 42529 28042 52924 50297 19541 12130 19633 53120  3411   374 53196 53208\n",
      " 53238 30422 53285  3996 53447 53522 18015  1584  4882 40246  1805 53832\n",
      " 43622 49727 18660  8116  2196 54082 54187  5988 54298 33831 24346 12547\n",
      " 17615 37948 54899 15688 54930 55076 36713 29373 55238 55247 36905 29553\n",
      " 13905 55366 55423 55700 48851 55741   123 51800 55883 55891   562  3728\n",
      " 26619  4000 46230 56050 15380  4289 56157 56170  7316 56250 10454 22850\n",
      " 22861 56339 56392 56411  7861 56487 56621 38748 56647 56659 56756 56758\n",
      " 44295 56996 57040 35819 19557 53138 47486 12504 57297 57315 57389  4124\n",
      " 17865 57528  4723 55069 57701 57727 56437 49790 25403 23572 42360 58134\n",
      " 58189 28004 21649 58217 48758 58265] [0.03 1.   0.62 0.29 1.   0.12 0.05 1.   0.18 0.19 0.02 0.01 0.05 0.27\n",
      " 0.43 0.42 0.03 0.43 0.11 1.   0.33 0.24 0.01 1.   0.36 0.04 1.   0.02\n",
      " 0.07 0.41 0.12 0.25 0.05 0.03 0.31 0.59 0.01 0.22 0.13 0.38 1.   0.02\n",
      " 0.14 1.   0.   0.01 0.04 0.08 0.23 0.22 0.12 0.2  0.57 0.26 0.05 0.21\n",
      " 0.88 0.22 0.71 0.57 0.   0.15 0.13 0.07 0.5  0.28 0.03 0.06 0.32 0.18\n",
      " 0.28 0.42 1.   0.13 0.14 0.04 0.14 0.22 1.   0.03 0.22 0.03 0.04 0.29\n",
      " 0.02 0.   0.41 0.19 0.49 0.15 0.35 0.11 0.23 0.26 0.55 0.01 0.33 0.05\n",
      " 0.23 0.19 0.46 0.61 0.35 0.39 0.33 0.2  0.83 0.17 0.07 0.02 0.15 0.05\n",
      " 0.4  0.11 0.61 0.15 0.2  0.54 0.01 0.1  0.13 0.01 0.05 0.   0.52 0.06\n",
      " 0.26 0.22 0.09 0.04 0.09 0.01 0.   0.01 0.04 0.35 0.24 0.13 0.28 0.78\n",
      " 0.23 0.   1.   0.04 0.22 0.47 0.57 0.19 1.   0.1  0.26 0.03 0.29 1.\n",
      " 0.18 0.1  0.35 0.04 0.09 0.08 0.02 0.29 0.18 0.09 0.02 0.41 1.   0.4\n",
      " 0.71 0.03 0.06 0.01 0.11 0.05 0.15 0.53 0.14 0.25 0.04 0.05 0.5  0.21\n",
      " 0.03 0.06 1.   0.03 0.03 0.16 0.59 0.08 0.34 0.41 0.11 0.12 0.18 0.1\n",
      " 0.39 0.05 0.34 0.02 0.19 0.18 0.   0.23 0.33 0.16 1.   0.68 0.06 0.13\n",
      " 1.   0.32 0.02 0.26 0.31 0.2  0.36 0.49 0.   0.02 0.1  0.05 1.   0.52\n",
      " 0.05 0.26 0.27 0.85 0.16 0.05 0.11 0.05 0.1  0.72 0.05 0.13 0.2  0.04\n",
      " 0.13 0.19 0.05 0.08 0.36 0.01 0.86 0.22 0.03 0.55 0.05 0.28 0.25 0.55\n",
      " 0.41 0.43 0.31 0.39 0.19 0.11 0.37 0.2  0.56 0.42 1.   0.59 0.27 0.11\n",
      " 0.25 0.02 0.2  0.4  0.01 0.33 0.03 0.02 0.12 0.32 0.07 0.08 0.04 0.13\n",
      " 0.05 0.43 0.01 1.   0.41 0.74 0.5  0.01 0.14 0.07 0.5  1.   0.7  0.35\n",
      " 0.15 0.32 1.   0.07 0.14 1.   0.06 0.62 0.04 0.06 0.47 0.04 0.24 0.03\n",
      " 0.26 0.01 1.   0.02 0.   0.36 0.29 0.02 0.16 0.15 0.1  0.04 0.24 0.41\n",
      " 0.4  0.44 0.04 0.13 0.21 0.31 0.34 0.25 0.37 0.02 0.03 0.8  0.03 0.18\n",
      " 1.   0.24 0.18 0.1  0.4  0.24 0.03 0.35 0.71 1.   0.2  0.36 0.66 0.\n",
      " 1.   0.64 0.26 0.24 0.56 0.5  0.18 0.03 0.24 0.65 0.04 0.02 0.26 0.09\n",
      " 1.   0.03 0.29 0.12 1.   0.16 0.01 0.62 0.25 0.   0.41 0.4  0.18 0.01\n",
      " 0.65 0.22 0.04 0.07 0.31 0.53 0.43 0.26 0.52 0.22 0.01 0.58 0.03 0.23\n",
      " 0.42 0.13 0.32 0.06 0.17 0.19 0.04 0.37 0.12 0.58 0.08 0.27 0.   0.35\n",
      " 0.34 0.48 0.33 0.1  1.   0.14 0.07 0.3  0.21 0.   0.08 0.24 0.38 0.52\n",
      " 0.05 1.   0.09 0.17 0.24 0.44 0.47 0.34 0.33 0.18 0.28 0.01 0.34 0.08\n",
      " 0.29 0.37 0.6  0.05 0.5  0.15 0.27 0.08 0.2  0.63 0.45 0.23 0.03 0.1\n",
      " 0.01 0.05 0.71 0.2  0.1  0.38 0.43 0.42 0.09 0.   0.1  0.02 0.64 0.5\n",
      " 1.   0.09 0.23 0.34 0.04 0.3  0.07 0.1  0.44 1.   0.04 0.02 1.   0.37\n",
      " 0.34 0.22 0.14 0.02 0.38 1.   0.07 0.39 0.31 0.41 0.15 0.02 0.87 0.09\n",
      " 0.04 0.09 0.15 0.67 0.01 0.31 0.33 0.56 0.53 0.07 0.29 0.85 0.41 0.07\n",
      " 0.27 0.01 0.1  0.12 0.03 0.69 0.28 0.04 0.09 0.03 0.39 0.29 0.6  1.\n",
      " 0.17 0.01 0.06 0.88 0.17 0.02 0.37 0.47 1.   1.   0.36 0.06 0.4  0.01\n",
      " 0.35 0.12 0.44 0.02 0.05 0.56 0.17 0.2  0.04 1.   0.14 0.26 0.59 0.14\n",
      " 0.28 0.04 0.25 0.19 0.69 0.43 0.01 0.3  0.09 0.34 0.14 0.21 0.27 0.05\n",
      " 0.26 0.43 0.8  0.51 0.42 0.05 0.1  0.03 0.25 0.05 0.19 0.36 0.08 0.27\n",
      " 1.   0.01 0.08 0.16 0.17 0.11 0.08 0.11 0.04 0.51 0.09 0.24 0.6  0.02\n",
      " 0.03 0.02 0.21 0.03 0.29 0.68 0.19 0.38 0.05 0.03 1.   0.39 0.01 0.\n",
      " 1.   0.34 0.77 0.46 0.88 0.06 0.01 0.09 0.32 0.22 0.55 0.16 0.25 0.25\n",
      " 0.91 0.6  0.25 0.14 0.25 0.37 0.24 0.12 0.03 0.28 0.32 0.42 0.39 0.16\n",
      " 0.27 0.09 0.16 0.19 0.43 0.06 0.08 0.07 0.03 0.39 0.64 0.11 0.28 0.04\n",
      " 0.22 0.23 0.05 0.08 0.01 0.16 0.08 0.39 0.26 0.1  0.09 1.   0.05 0.36\n",
      " 0.04 0.14 0.35 0.35 0.31 0.54 0.   1.   0.16 0.17 0.11 0.03 0.13 0.23\n",
      " 0.2  0.68 0.09 1.   0.08 0.33 1.   0.06 0.03 0.59 0.02 0.35 0.26 0.29\n",
      " 0.46 1.   0.71 0.41 0.01 0.22 0.64 0.06 0.23 0.15 0.32 0.38 0.38 0.07\n",
      " 0.04 0.97 0.19 0.21 0.94 0.4  0.14 0.05 0.02 0.26 0.29 0.06 0.04 0.02\n",
      " 0.36 0.13 0.58 0.18 0.91 0.75 0.01 0.51 0.23 0.01 0.3  0.03 0.34 0.02\n",
      " 0.09 0.2  0.25 0.77 0.72 0.24 0.01 0.19 0.62 0.11 0.05 0.36 0.3  0.89\n",
      " 0.44 0.23 0.81 0.77 0.46 0.01 0.01 0.39 0.15 0.02 0.07 0.11 0.18 0.3\n",
      " 0.6  1.   0.32 0.32 0.14 0.33 0.38 0.39 0.01 0.37 0.45 0.14 0.06 0.15\n",
      " 0.03 0.64 0.02 0.41 0.18 0.46 0.48 1.   0.02 0.04 0.05 0.42 0.03 0.57\n",
      " 0.03 0.89 0.08 0.6  0.29 0.   0.28 0.55 0.   0.74 1.   0.15 0.12 0.06\n",
      " 0.08 1.   0.01 1.   0.06 0.27 0.08 0.1  0.03 0.21 0.06 0.2  0.01 0.04\n",
      " 0.28 0.1  1.   0.3  0.13 0.02 0.13 0.77 1.   0.15 0.03 0.7  0.45 0.12\n",
      " 0.06 0.32 0.43 0.53 0.06 0.3  0.   0.03]\n",
      "5 [    5    32    35   148   363   442   504   609   712   716  1332  1341\n",
      "  1378  1449  2196  2588  3374  3386   430  4312  4409  4562  4605  4678\n",
      "  5004  5150  5344  5808  5960  6131  6307  7093  1039  7298  4441  7523\n",
      "  7585  7591  7787  7809  7810  8081  8096  8642  8867  8968  9073  9148\n",
      "  9252  9364  3641  9612  9744  9908 10014 10046 10168 10360  4568 10552\n",
      "  5101 11053 11139 11625 11864    84 12479 12668 13220 13295 13588 13704\n",
      " 13840 11230 14441 14520 14992 15136 15159 12687 15293 15407 15495 15499\n",
      " 15563 15696 15962 16071  5173 16292 16331 16429 11331 16591 16628 16766\n",
      "  5850 11831 17033 17187 17325 17371   397 12373   491 17514 17810  4147\n",
      " 17834 17862 17864 17919 18652 18672 18827 18853 18967 19247 14446 19400\n",
      " 19513  6608 19884 12660 20025 20143 20158 20359 20567 20757  2042 21115\n",
      "  8513 21446 11764 21884 17283 22307 22333 22457  1040  4510 22916  4787\n",
      "  2211 23507 23555 23703 21781 24170 24396  6879 10286 25120 25138 16197\n",
      " 25333 25336 25445 18806 25485 25499 25916 26238 26331 26387   503 26555\n",
      " 20075  4299 26821 26826  4485 22845 27098 27164 13475 27304 13540 27350\n",
      " 27568 27714 27884  2749 27910 28063 28399  3595 28593 28644 15673 18378\n",
      " 11392 29697 29701 29948 29994  9157   352 22155 30461  7134 30769 10180\n",
      " 15560 10216 10256 24823 30874 30904 24985 31491 19097 31743  8868 32274\n",
      "  9807 32553 32691 32758 32779  4480 23107 33177 33503  5852 33819 33894\n",
      " 34146 15031 34318 34340  9795 32636 15769 32894 35058 35167 35200  8210\n",
      " 35295  5486 35355 25614 35471 21661  6118 35745 36015 36020 26531 10030\n",
      " 36919  5264 21147 37207 37314  2847 37395 11747   332  7170  7238 15557\n",
      "  4570  4623 15936 38428 36713 13507  1843 38615  2070 14139 39040 39349\n",
      "  3327 30307   356 34198 39500 39509 38022 39980 39994 40543  8566 41389\n",
      " 15848 34880 42376 42506  5994 42529 42567 17077  3254 30141 14945 42874\n",
      " 42924 43068 43073  7018 17816 32767 26924 43336 32929  2113 21094 44187\n",
      "  3301 44513 44604 37866  9920 44807 28792  1317 45141 45456 12276 15046\n",
      "  7013 46329 46352 26844 10675 46685 10934  5164 45537 47046  5741 39072\n",
      " 33703 11683 16994 47639 47704 47768   870 47774 47883 47908 47951 48031\n",
      " 29253 16191  2279 48494 48615 48617 48763 48907   365 20236 28824 43298\n",
      " 49510 49636 29630  3378 50913 18170 15794 51086 38645 21319 19197 51573\n",
      " 17109 48818 51733 51736 22144  3969 52020 46235 41543 52237 49460 32903\n",
      " 32939 38357  4966  5074 52642 11624  6084 52983 28209 53054 51717 53100\n",
      " 53159 53202 26522 39777 15720 39987 53605 53982 54013  2305  5679  5923\n",
      "  3528 30606 28809  4669 15967 27425 55390 30030 55740 26330 42950 52107\n",
      " 49331  7708  4874 16290 23251 33270 13942 23468 56677 27686 56716 56845\n",
      " 28011 56936 56989 17149 19800  7473 54960 57780 51142 57892 57907 57916\n",
      " 48467 19009 25706 58104 37435] [0.35 0.02 0.04 1.   0.36 0.2  0.47 0.02 1.   0.12 0.25 0.02 0.31 0.03\n",
      " 0.2  0.22 0.14 0.13 0.38 1.   0.31 0.15 0.42 0.44 0.28 0.02 0.58 0.01\n",
      " 0.14 0.02 0.02 0.59 0.46 0.48 0.34 0.35 0.28 0.13 0.08 0.09 0.4  0.24\n",
      " 0.41 0.04 0.23 0.26 1.   0.32 0.67 0.33 0.24 0.13 0.04 0.24 0.34 0.29\n",
      " 0.15 0.63 0.54 0.33 0.59 0.06 0.09 1.   0.44 1.   0.46 0.02 0.14 0.26\n",
      " 0.29 0.64 0.19 0.37 0.23 0.12 0.16 0.36 0.2  0.25 0.21 1.   0.   0.25\n",
      " 0.12 0.19 0.01 1.   0.34 0.09 0.74 1.   0.02 0.38 0.19 0.21 0.24 0.45\n",
      " 0.27 0.17 0.43 0.23 0.21 0.3  0.04 0.16 0.25 0.04 0.22 0.34 0.2  0.07\n",
      " 0.35 0.46 0.07 0.26 0.11 0.08 0.11 0.28 1.   0.05 0.2  0.64 0.25 0.44\n",
      " 0.04 0.11 0.08 0.26 0.37 1.   0.71 1.   0.33 0.66 0.41 0.38 0.23 0.11\n",
      " 0.65 0.24 0.4  0.02 0.53 0.34 1.   1.   0.23 1.   0.54 0.59 0.29 0.07\n",
      " 0.59 0.15 0.24 0.3  1.   0.32 0.01 0.14 0.49 0.14 0.17 0.15 0.02 0.75\n",
      " 0.5  0.01 0.19 0.14 0.2  0.35 0.31 0.06 0.23 0.21 0.27 0.56 0.05 0.2\n",
      " 0.22 0.08 0.34 0.41 0.46 0.46 0.2  0.51 0.41 0.39 0.33 0.29 0.77 0.21\n",
      " 0.2  0.25 1.   0.23 0.25 0.01 0.67 1.   0.06 0.38 0.24 0.42 0.21 0.1\n",
      " 0.03 0.19 0.03 0.19 1.   0.11 0.89 0.36 0.02 0.17 1.   0.28 0.18 0.29\n",
      " 0.12 0.   0.21 0.36 0.08 0.02 0.43 0.03 1.   0.15 0.2  0.22 0.23 0.32\n",
      " 0.06 0.18 1.   0.41 1.   0.27 0.03 0.52 1.   0.69 0.02 0.05 0.36 0.15\n",
      " 0.06 0.2  0.22 0.03 0.36 0.57 0.44 0.04 0.5  0.37 0.02 0.11 0.08 0.29\n",
      " 0.18 0.12 0.01 0.   0.24 0.12 0.14 0.46 0.01 0.26 0.01 0.25 0.29 0.98\n",
      " 0.21 0.18 0.08 0.11 0.71 0.23 0.49 0.35 0.24 0.02 0.4  0.14 0.02 0.01\n",
      " 0.33 0.26 0.05 0.3  0.01 0.27 0.14 0.12 1.   0.09 0.22 0.23 0.28 0.02\n",
      " 0.6  0.01 0.94 0.21 0.19 0.05 0.02 0.6  0.23 0.33 0.16 0.36 0.3  0.\n",
      " 0.03 0.23 0.01 1.   0.06 0.05 0.34 0.01 0.5  0.74 0.18 0.22 0.33 0.03\n",
      " 0.33 0.14 0.85 0.13 0.29 0.21 0.32 0.35 0.42 0.22 0.1  1.   0.27 0.12\n",
      " 0.38 0.4  0.46 0.06 0.25 1.   0.04 0.18 0.32 0.03 0.32 0.16 0.4  0.25\n",
      " 0.37 1.   0.02 1.   0.03 0.16 0.11 0.01 0.04 0.16 0.13 0.12 0.31 0.2\n",
      " 0.02 0.06 0.02 0.31 0.12 0.25 0.12 0.12 0.39 0.48 0.1  0.01 0.21 0.2\n",
      " 0.05 0.79 0.22 0.39 0.96 0.   0.5  0.06 0.12 0.32 0.12 0.77 0.46 0.15\n",
      " 0.3  0.94 0.58 0.01 0.04 0.35 0.89 1.   0.16 0.01 1.   0.48 0.68 0.68\n",
      " 0.62 0.32 0.13 0.21 0.24 0.45 0.81 1.   0.5  0.29 0.39 1.   1.   0.61\n",
      " 1.   0.21 0.29 0.17 0.07 0.17 0.81 0.04 0.03 0.01 0.04 0.39 0.04 0.44\n",
      " 0.49]\n"
     ]
    }
   ],
   "source": [
    "grouped_by_items = mapped_df.groupby(\"itemId\")\n",
    "iter = 0\n",
    "for item, grouped in grouped_by_items:\n",
    "    print(item, grouped[\"userId\"].values, grouped[\"rating\"].values)\n",
    "    iter = iter + 1\n",
    "    if iter > 5:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /tmp/ipykernel_13523/1646577164.py:3: The name tf.python_io.TFRecordWriter is deprecated. Please use tf.io.TFRecordWriter instead.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "grouped_by_items = mapped_df.groupby(\"itemId\")\n",
    "with tf.python_io.TFRecordWriter(\"data/users_for_item\") as ofp:\n",
    "    for item, grouped in grouped_by_items:\n",
    "        example = tf.train.Example(features = tf.train.Features(feature = {\n",
    "            \"key\": tf.train.Feature(int64_list = tf.train.Int64List(value = [item])),\n",
    "            \"indices\": tf.train.Feature(int64_list = tf.train.Int64List(value = grouped[\"userId\"].values)),\n",
    "            \"values\": tf.train.Feature(float_list = tf.train.FloatList(value = grouped[\"rating\"].values))\n",
    "        }))\n",
    "        ofp.write(example.SerializeToString())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "grouped_by_users = mapped_df.groupby(\"userId\")\n",
    "with tf.python_io.TFRecordWriter(\"data/items_for_user\") as ofp:\n",
    "    for user, grouped in grouped_by_users:\n",
    "        example = tf.train.Example(features = tf.train.Features(feature = {\n",
    "            \"key\": tf.train.Feature(int64_list = tf.train.Int64List(value = [user])),\n",
    "            \"indices\": tf.train.Feature(int64_list = tf.train.Int64List(value = grouped[\"itemId\"].values)),\n",
    "            \"values\": tf.train.Feature(float_list = tf.train.FloatList(value = grouped[\"rating\"].values))\n",
    "        }))\n",
    "        ofp.write(example.SerializeToString())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total 36580\n",
      "-rw-r--r-- 1 jupyter jupyter 14124035 May 16 17:32 collab_raw.csv\n",
      "-rw-r--r-- 1 jupyter jupyter  3529114 May 16 17:32 users.csv\n",
      "-rw-r--r-- 1 jupyter jupyter    82083 May 16 17:32 items.csv\n",
      "-rw-r--r-- 1 jupyter jupyter  7667828 May 16 17:32 collab_mapped.csv\n",
      "-rw-r--r-- 1 jupyter jupyter  2296476 May 16 17:33 users_for_item\n",
      "-rw-r--r-- 1 jupyter jupyter  9743438 May 16 17:33 items_for_user\n"
     ]
    }
   ],
   "source": [
    "!ls -lrt data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "To summarize, you created the following data files from collab_raw.csv:\n",
    "<ol>\n",
    "<li> ```collab_mapped.csv``` is essentially the same data as in ```collab_raw.csv``` except that ```visitorId``` and ```contentId``` which are business-specific have been mapped to ```userId``` and ```itemId``` which are enumerated in 0,1,2,....  The mappings themselves are stored in ```items.csv``` and ```users.csv``` so that they can be used during inference.\n",
    "<li> ```users_for_item``` contains all the users/ratings for each item in TFExample format\n",
    "<li> ```items_for_user``` contains all the items/ratings for each user in TFExample format\n",
    "</ol>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Train with WALS\n",
    "\n",
    "Once you have the dataset, do matrix factorization with WALS using the [WALSMatrixFactorization](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/factorization/WALSMatrixFactorization) in the contrib directory.\n",
    "This is an estimator model, so it should be relatively familiar.\n",
    "<p>\n",
    "As usual, you write an input_fn to provide the data to the model, and then create the Estimator to do train_and_evaluate.\n",
    "Because it is in contrib and hasn't moved over to tf.estimator yet, you use tf.contrib.learn.Experiment to handle the training loop.<p>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import tensorflow as tf\n",
    "from tensorflow.python.lib.io import file_io\n",
    "from tensorflow.contrib.factorization import WALSMatrixFactorization\n",
    "  \n",
    "def read_dataset(mode, args):\n",
    "# TODO 2: Decode the example\n",
    "    def decode_example(protos, vocab_size):\n",
    "        features = {\n",
    "            \"key\": tf.FixedLenFeature(shape = [1], dtype = tf.int64),\n",
    "            \"indices\": tf.VarLenFeature(dtype = tf.int64),\n",
    "            \"values\": tf.VarLenFeature(dtype = tf.float32)}\n",
    "        parsed_features = tf.parse_single_example(serialized = protos, features = features)\n",
    "        values = tf.sparse_merge(sp_ids = parsed_features[\"indices\"], sp_values = parsed_features[\"values\"], vocab_size = vocab_size)\n",
    "        # Save key to remap after batching\n",
    "        # This is a temporary workaround to assign correct row numbers in each batch.\n",
    "        # You can ignore details of this part and remap_keys().\n",
    "        key = parsed_features[\"key\"]\n",
    "        decoded_sparse_tensor = tf.SparseTensor(indices = tf.concat(values = [values.indices, [key]], axis = 0), \n",
    "                                                values = tf.concat(values = [values.values, [0.0]], axis = 0), \n",
    "                                                dense_shape = values.dense_shape)\n",
    "        return decoded_sparse_tensor\n",
    "  \n",
    "  \n",
    "    def remap_keys(sparse_tensor):\n",
    "        # Current indices of your SparseTensor that you need to fix\n",
    "        bad_indices = sparse_tensor.indices # shape = (current_batch_size * (number_of_items/users[i] + 1), 2)\n",
    "        # Current values of your SparseTensor that you need to fix\n",
    "        bad_values = sparse_tensor.values # shape = (current_batch_size * (number_of_items/users[i] + 1),)\n",
    "\n",
    "        # Since batch is ordered, the last value for a batch index is the user\n",
    "        # Find where the batch index chages to extract the user rows\n",
    "        # 1 where user, else 0\n",
    "        user_mask = tf.concat(values = [bad_indices[1:,0] - bad_indices[:-1,0], tf.constant(value = [1], dtype = tf.int64)], axis = 0) # shape = (current_batch_size * (number_of_items/users[i] + 1), 2)\n",
    "\n",
    "        # Mask out the user rows from the values\n",
    "        good_values = tf.boolean_mask(tensor = bad_values, mask = tf.equal(x = user_mask, y = 0)) # shape = (current_batch_size * number_of_items/users[i],)\n",
    "        item_indices = tf.boolean_mask(tensor = bad_indices, mask = tf.equal(x = user_mask, y = 0)) # shape = (current_batch_size * number_of_items/users[i],)\n",
    "        user_indices = tf.boolean_mask(tensor = bad_indices, mask = tf.equal(x = user_mask, y = 1))[:, 1] # shape = (current_batch_size,)\n",
    "\n",
    "        good_user_indices = tf.gather(params = user_indices, indices = item_indices[:,0]) # shape = (current_batch_size * number_of_items/users[i],)\n",
    "\n",
    "        # User and item indices are rank 1, need to make rank 1 to concat\n",
    "        good_user_indices_expanded = tf.expand_dims(input = good_user_indices, axis = -1) # shape = (current_batch_size * number_of_items/users[i], 1)\n",
    "        good_item_indices_expanded = tf.expand_dims(input = item_indices[:, 1], axis = -1) # shape = (current_batch_size * number_of_items/users[i], 1)\n",
    "        good_indices = tf.concat(values = [good_user_indices_expanded, good_item_indices_expanded], axis = 1) # shape = (current_batch_size * number_of_items/users[i], 2)\n",
    "\n",
    "        remapped_sparse_tensor = tf.SparseTensor(indices = good_indices, values = good_values, dense_shape = sparse_tensor.dense_shape)\n",
    "        return remapped_sparse_tensor\n",
    "\n",
    "    \n",
    "    def parse_tfrecords(filename, vocab_size):\n",
    "        if mode == tf.estimator.ModeKeys.TRAIN:\n",
    "            num_epochs = None # indefinitely\n",
    "        else:\n",
    "            num_epochs = 1 # end-of-input after this\n",
    "\n",
    "        files = tf.gfile.Glob(filename = os.path.join(args[\"input_path\"], filename))\n",
    "\n",
    "        # Create dataset from file list\n",
    "        dataset = tf.data.TFRecordDataset(files)\n",
    "        dataset = dataset.map(map_func = lambda x: decode_example(x, vocab_size))\n",
    "        dataset = dataset.repeat(count = num_epochs)\n",
    "        dataset = dataset.batch(batch_size = args[\"batch_size\"])\n",
    "        dataset = dataset.map(map_func = lambda x: remap_keys(x))\n",
    "        return dataset.make_one_shot_iterator().get_next()\n",
    "  \n",
    "    def _input_fn():\n",
    "        features = {\n",
    "            WALSMatrixFactorization.INPUT_ROWS: parse_tfrecords(\"items_for_user\", args[\"nitems\"]),\n",
    "            WALSMatrixFactorization.INPUT_COLS: parse_tfrecords(\"users_for_item\", args[\"nusers\"]),\n",
    "            WALSMatrixFactorization.PROJECT_ROW: tf.constant(True)\n",
    "        }\n",
    "        return features, None\n",
    "\n",
    "    return _input_fn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "This code is helpful in developing the input function. You don't need it in production."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /tmp/ipykernel_13523/171886433.py:2: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
      "\n",
      "WARNING:tensorflow:From /tmp/ipykernel_13523/3925013467.py:57: The name tf.gfile.Glob is deprecated. Please use tf.io.gfile.glob instead.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/autograph/converters/directives.py:119: The name tf.FixedLenFeature is deprecated. Please use tf.io.FixedLenFeature instead.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/autograph/converters/directives.py:119: The name tf.VarLenFeature is deprecated. Please use tf.io.VarLenFeature instead.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/autograph/converters/directives.py:119: The name tf.parse_single_example is deprecated. Please use tf.io.parse_single_example instead.\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2022-05-16 17:40:20.509438: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2200225000 Hz\n",
      "2022-05-16 17:40:20.510339: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55a7e3dcc0d0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:\n",
      "2022-05-16 17:40:20.510379: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version\n",
      "2022-05-16 17:40:20.511445: I tensorflow/core/common_runtime/process_util.cc:136] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /tmp/ipykernel_13523/3925013467.py:13: sparse_merge (from tensorflow.python.ops.sparse_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "No similar op available at this time.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/ops/array_ops.py:1475: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
      "WARNING:tensorflow:From /tmp/ipykernel_13523/3925013467.py:65: DatasetV1.make_one_shot_iterator (from tensorflow.python.data.ops.dataset_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `for ... in dataset:` to iterate over a dataset. If using `tf.estimator`, return the `Dataset` object directly from your input function. As a last resort, you can use `tf.compat.v1.data.make_one_shot_iterator(dataset)`.\n",
      "SparseTensorValue(indices=array([[   0,    0],\n",
      "       [   0,  129],\n",
      "       [   0,  233],\n",
      "       [   0,  662],\n",
      "       [   1,    1],\n",
      "       [   1,    9],\n",
      "       [   1,   13],\n",
      "       [   1,   52],\n",
      "       [   1,  160],\n",
      "       [   1,  200],\n",
      "       [   1,  261],\n",
      "       [   1, 5635],\n",
      "       [   2,    2],\n",
      "       [   2,  182],\n",
      "       [   3,    3],\n",
      "       [   3,  144],\n",
      "       [   3, 5611],\n",
      "       [   3, 5615],\n",
      "       [   3, 5616],\n",
      "       [   3, 5620],\n",
      "       [   3, 5623],\n",
      "       [   3, 5624],\n",
      "       [   3, 5637],\n",
      "       [   3, 5638]]), values=array([1.  , 0.89, 1.  , 1.  , 1.  , 0.07, 0.34, 0.48, 1.  , 0.11, 0.37,\n",
      "       0.33, 0.86, 0.67, 0.55, 0.16, 1.  , 0.23, 0.46, 1.  , 1.  , 1.  ,\n",
      "       0.23, 1.  ], dtype=float32), dense_shape=array([   4, 5662]))\n",
      "SparseTensorValue(indices=array([[   4,    4],\n",
      "       [   5,    5],\n",
      "       [   5,   23],\n",
      "       [   5,   29],\n",
      "       [   5,   37],\n",
      "       [   5,   40],\n",
      "       [   5,   42],\n",
      "       [   5,   45],\n",
      "       [   5,   52],\n",
      "       [   5,   53],\n",
      "       [   5,  146],\n",
      "       [   5,  214],\n",
      "       [   5,  245],\n",
      "       [   5,  365],\n",
      "       [   5,  395],\n",
      "       [   5,  752],\n",
      "       [   5,  852],\n",
      "       [   5, 1336],\n",
      "       [   5, 5621],\n",
      "       [   5, 5627],\n",
      "       [   5, 5635],\n",
      "       [   5, 5642],\n",
      "       [   5, 5644],\n",
      "       [   5, 5648],\n",
      "       [   5, 5653],\n",
      "       [   6,    6],\n",
      "       [   6,   30],\n",
      "       [   6,   35],\n",
      "       [   6,  162],\n",
      "       [   6,  453],\n",
      "       [   6,  615],\n",
      "       [   6, 5619],\n",
      "       [   7,    7]]), values=array([0.03, 0.35, 0.28, 1.  , 1.  , 0.67, 0.63, 1.  , 1.  , 0.57, 0.05,\n",
      "       0.64, 0.17, 0.6 , 0.36, 0.15, 0.19, 0.17, 0.28, 0.77, 0.17, 0.35,\n",
      "       1.  , 0.46, 1.  , 0.14, 0.33, 0.12, 0.06, 0.09, 0.04, 0.47, 1.  ],\n",
      "      dtype=float32), dense_shape=array([   4, 5662]))\n"
     ]
    }
   ],
   "source": [
    "def try_out():\n",
    "    with tf.Session() as sess:\n",
    "        fn = read_dataset(\n",
    "            mode = tf.estimator.ModeKeys.EVAL, \n",
    "            args = {\"input_path\": \"data\", \"batch_size\": 4, \"nitems\": NITEMS, \"nusers\": NUSERS})\n",
    "        feats, _ = fn()\n",
    "        \n",
    "        print(feats[\"input_rows\"].eval())\n",
    "        print(feats[\"input_rows\"].eval())\n",
    "\n",
    "try_out()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "def find_top_k(user, item_factors, k):\n",
    "    all_items = tf.matmul(a = tf.expand_dims(input = user, axis = 0), b = tf.transpose(a = item_factors))\n",
    "    topk = tf.nn.top_k(input = all_items, k = k)\n",
    "    return tf.cast(x = topk.indices, dtype = tf.int64)\n",
    "    \n",
    "def batch_predict(args):\n",
    "    import numpy as np\n",
    "    with tf.Session() as sess:\n",
    "        estimator = tf.contrib.factorization.WALSMatrixFactorization(\n",
    "            num_rows = args[\"nusers\"], \n",
    "            num_cols = args[\"nitems\"],\n",
    "            embedding_dimension = args[\"n_embeds\"],\n",
    "            model_dir = args[\"output_dir\"])\n",
    "        \n",
    "        # This is how you would get the row factors for out-of-vocab user data\n",
    "        # row_factors = list(estimator.get_projections(input_fn=read_dataset(tf.estimator.ModeKeys.EVAL, args)))\n",
    "        # user_factors = tf.convert_to_tensor(np.array(row_factors))\n",
    "\n",
    "        # But for in-vocab data, the row factors are already in the checkpoint\n",
    "        user_factors = tf.convert_to_tensor(value = estimator.get_row_factors()[0]) # (nusers, nembeds)\n",
    "        # In either case, you have to assume catalog doesn\"t change, so col_factors are read in\n",
    "        item_factors = tf.convert_to_tensor(value = estimator.get_col_factors()[0])# (nitems, nembeds)\n",
    "\n",
    "        # For each user, find the top K items\n",
    "        topk = tf.squeeze(input = tf.map_fn(fn = lambda user: find_top_k(user, item_factors, args[\"topk\"]), elems = user_factors, dtype = tf.int64))\n",
    "        with file_io.FileIO(os.path.join(args[\"output_dir\"], \"batch_pred.txt\"), mode = 'w') as f:\n",
    "            for best_items_for_user in topk.eval():\n",
    "                f.write(\",\".join(str(x) for x in best_items_for_user) + '\\n')\n",
    "\n",
    "def train_and_evaluate(args):\n",
    "    train_steps = int(0.5 + (1.0 * args[\"num_epochs\"] * args[\"nusers\"]) / args[\"batch_size\"])\n",
    "    steps_in_epoch = int(0.5 + args[\"nusers\"] / args[\"batch_size\"])\n",
    "    print(\"Will train for {} steps, evaluating once every {} steps\".format(train_steps, steps_in_epoch))\n",
    "    def experiment_fn(output_dir):\n",
    "        return tf.contrib.learn.Experiment(\n",
    "            tf.contrib.factorization.WALSMatrixFactorization(\n",
    "                num_rows = args[\"nusers\"], \n",
    "                num_cols = args[\"nitems\"],\n",
    "                embedding_dimension = args[\"n_embeds\"],\n",
    "                model_dir = args[\"output_dir\"]),\n",
    "            train_input_fn = read_dataset(tf.estimator.ModeKeys.TRAIN, args),\n",
    "            eval_input_fn = read_dataset(tf.estimator.ModeKeys.EVAL, args),\n",
    "            train_steps = train_steps,\n",
    "            eval_steps = 1,\n",
    "            min_eval_frequency = steps_in_epoch\n",
    "        )\n",
    "\n",
    "    from tensorflow.contrib.learn.python.learn import learn_runner\n",
    "    learn_runner.run(experiment_fn = experiment_fn, output_dir = args[\"output_dir\"])\n",
    "    \n",
    "    batch_predict(args)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Will train for 12 steps, evaluating once every 236 steps\n",
      "WARNING:tensorflow:From /tmp/ipykernel_13523/1819520735.py:49: run (from tensorflow.contrib.learn.python.learn.learn_runner) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.estimator.train_and_evaluate.\n",
      "WARNING:tensorflow:\n",
      "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "  * https://github.com/tensorflow/io (for I/O related ops)\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:1180: BaseEstimator.__init__ (from tensorflow.contrib.learn.python.learn.estimators.estimator) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please replace uses of any Estimator from tf.contrib.learn with an Estimator from tf.estimator.*\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:427: RunConfig.__init__ (from tensorflow.contrib.learn.python.learn.estimators.run_config) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "When switching to tf.estimator.Estimator, use tf.estimator.RunConfig instead.\n",
      "INFO:tensorflow:Using default config.\n",
      "INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7fc3e838dfd0>, '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'local', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_eval_distribute': None, '_experimental_max_worker_delay_secs': None, '_device_fn': None, '_tf_config': gpu_options {\n",
      "  per_process_gpu_memory_fraction: 1.0\n",
      "}\n",
      ", '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_protocol': None, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': 'wals_trained', '_session_creation_timeout_secs': 7200}\n",
      "WARNING:tensorflow:From /tmp/ipykernel_13523/1819520735.py:45: Experiment.__init__ (from tensorflow.contrib.learn.python.learn.experiment) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please switch to tf.estimator.train_and_evaluate. You will also have to convert to a tf.estimator.Estimator.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/monitors.py:279: BaseMonitor.__init__ (from tensorflow.contrib.learn.python.learn.monitors) is deprecated and will be removed after 2016-12-05.\n",
      "Instructions for updating:\n",
      "Monitors are deprecated. Please use tf.train.SessionRunHook.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/factorization/python/ops/wals.py:315: ModelFnOps.__new__ (from tensorflow.contrib.learn.python.learn.estimators.model_fn) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "When switching to tf.estimator.Estimator, use tf.estimator.EstimatorSpec. You can use the `estimator_spec` method to create an equivalent one.\n",
      "INFO:tensorflow:Create CheckpointSaverHook.\n",
      "INFO:tensorflow:Graph was finalized.\n",
      "INFO:tensorflow:Running local_init_op.\n",
      "INFO:tensorflow:Done running local_init_op.\n",
      "INFO:tensorflow:Saving checkpoints for 0 into wals_trained/model.ckpt.\n",
      "INFO:tensorflow:SweepHook running init op.\n",
      "INFO:tensorflow:SweepHook running prep ops for the row sweep.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:loss = 193699.97, step = 1\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Saving checkpoints for 12 into wals_trained/model.ckpt.\n",
      "INFO:tensorflow:Loss for final step: 162428.39.\n",
      "INFO:tensorflow:Starting evaluation at 2022-05-16T17:40:42Z\n",
      "INFO:tensorflow:Graph was finalized.\n",
      "INFO:tensorflow:Restoring parameters from wals_trained/model.ckpt-12\n",
      "INFO:tensorflow:Running local_init_op.\n",
      "INFO:tensorflow:Done running local_init_op.\n",
      "INFO:tensorflow:Evaluation [1/1]\n",
      "INFO:tensorflow:Finished evaluation at 2022-05-16-17:40:43\n",
      "INFO:tensorflow:Saving dict for global step 12: global_step = 12, loss = 193699.97\n",
      "INFO:tensorflow:Using default config.\n",
      "INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7fc3e838dfd0>, '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'local', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_eval_distribute': None, '_experimental_max_worker_delay_secs': None, '_device_fn': None, '_tf_config': gpu_options {\n",
      "  per_process_gpu_memory_fraction: 1.0\n",
      "}\n",
      ", '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_protocol': None, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': 'wals_trained', '_session_creation_timeout_secs': 7200}\n"
     ]
    }
   ],
   "source": [
    "import shutil\n",
    "shutil.rmtree(path = \"wals_trained\", ignore_errors=True)\n",
    "train_and_evaluate({\n",
    "    \"output_dir\": \"wals_trained\",\n",
    "    \"input_path\": \"data/\",\n",
    "    \"num_epochs\": 0.05,\n",
    "    \"nitems\": NITEMS,\n",
    "    \"nusers\": NUSERS,\n",
    "\n",
    "    \"batch_size\": 512,\n",
    "    \"n_embeds\": 10,\n",
    "    \"topk\": 3\n",
    "  })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "batch_pred.txt\n",
      "checkpoint\n",
      "eval\n",
      "events.out.tfevents.1652722839.tensorflow-1-15-20220516-225105\n",
      "graph.pbtxt\n",
      "model.ckpt-0.data-00000-of-00001\n",
      "model.ckpt-0.index\n",
      "model.ckpt-0.meta\n",
      "model.ckpt-12.data-00000-of-00001\n",
      "model.ckpt-12.index\n",
      "model.ckpt-12.meta\n"
     ]
    }
   ],
   "source": [
    "!ls wals_trained"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5526,129,885\n",
      "4712,2402,2620\n",
      "2710,139,1001\n",
      "885,5526,3450\n",
      "202,370,2839\n",
      "4972,1085,4505\n",
      "4896,1687,2833\n",
      "3418,5095,2702\n",
      "3537,479,4896\n",
      "1001,4516,2347\n"
     ]
    }
   ],
   "source": [
    "!head wals_trained/batch_pred.txt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Run as a Python module\n",
    "\n",
    "Let's run it as Python module for just a few steps."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.environ[\"NITEMS\"] = str(NITEMS)\n",
    "os.environ[\"NUSERS\"] = str(NUSERS)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Will train for 2 steps, evaluating once every 236 steps\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:27: The name tf.logging.set_verbosity is deprecated. Please use tf.compat.v1.logging.set_verbosity instead.\n",
      "\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:27: The name tf.logging.INFO is deprecated. Please use tf.compat.v1.logging.INFO instead.\n",
      "\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:198: run (from tensorflow.contrib.learn.python.learn.learn_runner) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.estimator.train_and_evaluate.\n",
      "WARNING:tensorflow:\n",
      "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "  * https://github.com/tensorflow/io (for I/O related ops)\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:1180: BaseEstimator.__init__ (from tensorflow.contrib.learn.python.learn.estimators.estimator) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please replace uses of any Estimator from tf.contrib.learn with an Estimator from tf.estimator.*\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:427: RunConfig.__init__ (from tensorflow.contrib.learn.python.learn.estimators.run_config) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "When switching to tf.estimator.Estimator, use tf.estimator.RunConfig instead.\n",
      "INFO:tensorflow:Using default config.\n",
      "INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7fdf7d13df90>, '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'cloud', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_eval_distribute': None, '_experimental_max_worker_delay_secs': None, '_device_fn': None, '_tf_config': gpu_options {\n",
      "  per_process_gpu_memory_fraction: 1.0\n",
      "}\n",
      ", '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_protocol': None, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': '/home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/wals_trained/', '_session_creation_timeout_secs': 7200}\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:194: make_export_strategy (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/utils/saved_model_export_utils.py:484: ExportStrategy.__new__ (from tensorflow.contrib.learn.python.learn.export_strategy) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please switch to tf.estimator.train_and_evaluate, and use tf.estimator.Exporter.\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:194: Experiment.__init__ (from tensorflow.contrib.learn.python.learn.experiment) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please switch to tf.estimator.train_and_evaluate. You will also have to convert to a tf.estimator.Estimator.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/monitors.py:279: BaseMonitor.__init__ (from tensorflow.contrib.learn.python.learn.monitors) is deprecated and will be removed after 2016-12-05.\n",
      "Instructions for updating:\n",
      "Monitors are deprecated. Please use tf.train.SessionRunHook.\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:85: The name tf.gfile.Glob is deprecated. Please use tf.io.gfile.glob instead.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/autograph/converters/directives.py:119: The name tf.FixedLenFeature is deprecated. Please use tf.io.FixedLenFeature instead.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/autograph/converters/directives.py:119: The name tf.VarLenFeature is deprecated. Please use tf.io.VarLenFeature instead.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/autograph/converters/directives.py:119: The name tf.parse_single_example is deprecated. Please use tf.io.parse_single_example instead.\n",
      "\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:41: sparse_merge (from tensorflow.python.ops.sparse_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "No similar op available at this time.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/ops/array_ops.py:1475: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:93: DatasetV1.make_one_shot_iterator (from tensorflow.python.data.ops.dataset_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use `for ... in dataset:` to iterate over a dataset. If using `tf.estimator`, return the `Dataset` object directly from your input function. As a last resort, you can use `tf.compat.v1.data.make_one_shot_iterator(dataset)`.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/factorization/python/ops/wals.py:315: ModelFnOps.__new__ (from tensorflow.contrib.learn.python.learn.estimators.model_fn) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "When switching to tf.estimator.Estimator, use tf.estimator.EstimatorSpec. You can use the `estimator_spec` method to create an equivalent one.\n",
      "INFO:tensorflow:Create CheckpointSaverHook.\n",
      "INFO:tensorflow:Graph was finalized.\n",
      "2022-05-16 17:41:57.967197: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2200225000 Hz\n",
      "2022-05-16 17:41:57.967730: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55c1e30cd920 initialized for platform Host (this does not guarantee that XLA will be used). Devices:\n",
      "2022-05-16 17:41:57.967776: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version\n",
      "2022-05-16 17:41:57.967913: I tensorflow/core/common_runtime/process_util.cc:136] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.\n",
      "INFO:tensorflow:Running local_init_op.\n",
      "INFO:tensorflow:Done running local_init_op.\n",
      "INFO:tensorflow:Saving checkpoints for 0 into /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/wals_trained/model.ckpt.\n",
      "INFO:tensorflow:SweepHook running init op.\n",
      "INFO:tensorflow:SweepHook running prep ops for the row sweep.\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:loss = 193920.0, step = 1\n",
      "INFO:tensorflow:Next fit step starting.\n",
      "INFO:tensorflow:Saving checkpoints for 2 into /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/wals_trained/model.ckpt.\n",
      "INFO:tensorflow:Loss for final step: 165045.23.\n",
      "INFO:tensorflow:Starting evaluation at 2022-05-16T17:42:00Z\n",
      "INFO:tensorflow:Graph was finalized.\n",
      "INFO:tensorflow:Restoring parameters from /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/wals_trained/model.ckpt-2\n",
      "INFO:tensorflow:Running local_init_op.\n",
      "INFO:tensorflow:Done running local_init_op.\n",
      "INFO:tensorflow:Evaluation [1/1]\n",
      "INFO:tensorflow:Finished evaluation at 2022-05-16-17:42:00\n",
      "INFO:tensorflow:Saving dict for global step 2: global_step = 2, loss = 193920.0\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:1374: get_timestamped_export_dir (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:1379: get_temp_export_dir (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:157: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n",
      "\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:1389: get_input_alternatives (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:1403: get_output_alternatives (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/estimators/estimator.py:1413: build_all_signature_defs (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/utils/saved_model_export_utils.py:267: build_standardized_signature_def (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.\n",
      "INFO:tensorflow:Restoring parameters from /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/wals_trained/model.ckpt-2\n",
      "INFO:tensorflow:Assets added to graph.\n",
      "INFO:tensorflow:No assets to write.\n",
      "INFO:tensorflow:SavedModel written to: /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/wals_trained/export/Servo/temp-1652722920/saved_model.pb\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/utils/saved_model_export_utils.py:481: garbage_collect_exports (from tensorflow.contrib.learn.python.learn.utils.saved_model_export_utils) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Switch to tf.estimator.Exporter and associated utilities.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/utils/saved_model_export_utils.py:394: largest_export_versions (from tensorflow.contrib.learn.python.learn.utils.gc) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please implement your own file management or use Saver.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/utils/saved_model_export_utils.py:395: negation (from tensorflow.contrib.learn.python.learn.utils.gc) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please implement your own file management or use Saver.\n",
      "WARNING:tensorflow:From /opt/conda/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/utils/saved_model_export_utils.py:397: get_paths (from tensorflow.contrib.learn.python.learn.utils.gc) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please implement your own file name management.\n",
      "WARNING:tensorflow:From /home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/walsmodel/model.py:117: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
      "\n",
      "INFO:tensorflow:Using default config.\n",
      "INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7fdf7d0e7850>, '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'cloud', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_eval_distribute': None, '_experimental_max_worker_delay_secs': None, '_device_fn': None, '_tf_config': gpu_options {\n",
      "  per_process_gpu_memory_fraction: 1.0\n",
      "}\n",
      ", '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_protocol': None, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': '/home/jupyter/training-data-analyst/courses/machine_learning/deepdive/10_recommend/labs/wals_trained/', '_session_creation_timeout_secs': 7200}\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "rm -rf wals.tar.gz wals_trained\n",
    "gcloud ai-platform local train \\\n",
    "    --module-name=walsmodel.task \\\n",
    "    --package-path=${PWD}/walsmodel \\\n",
    "    -- \\\n",
    "    --output_dir=${PWD}/wals_trained \\\n",
    "    --input_path=${PWD}/data \\\n",
    "    --num_epochs=0.01 --nitems=${NITEMS} --nusers=${NUSERS} \\\n",
    "    --job-dir=./tmp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Get row and column factors\n",
    "\n",
    "Once you have a trained WALS model, you can get row and column factors (user and item embeddings) from the checkpoint file. You'll look at how to use these in the section on building a recommendation system using deep neural networks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_factors(args):\n",
    "    with tf.Session() as sess:\n",
    "        estimator = tf.contrib.factorization.WALSMatrixFactorization(\n",
    "            num_rows = args[\"nusers\"], \n",
    "            num_cols = args[\"nitems\"],\n",
    "            embedding_dimension = args[\"n_embeds\"],\n",
    "            model_dir = args[\"output_dir\"])\n",
    "        \n",
    "        row_factors = estimator.get_row_factors()[0]\n",
    "        col_factors = estimator.get_col_factors()[0]\n",
    "    return row_factors, col_factors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/jupyter/training-data-analyst/courses/machine_learning/deepdive2/recommendation_systems/solutions/wals_trained\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "echo $PWD/wals_trained"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Using default config.\n",
      "INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7fc3e9a79a10>, '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'local', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_eval_distribute': None, '_experimental_max_worker_delay_secs': None, '_device_fn': None, '_tf_config': gpu_options {\n",
      "  per_process_gpu_memory_fraction: 1.0\n",
      "}\n",
      ", '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_protocol': None, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': 'gs://qwiklabs-gcp-01-7f6e984e70dc/wals/model_trained', '_session_creation_timeout_secs': 7200}\n",
      "[[ 3.6948849e-03 -8.5906551e-04  4.8303331e-04 -1.5890118e-03\n",
      "   3.2951573e-03  1.8742392e-03 -4.0969993e-03  6.1582108e-03\n",
      "  -2.8773610e-04 -1.3332820e-03]\n",
      " [ 1.3797252e-03 -6.1344338e-04  1.8084486e-03 -1.3052947e-03\n",
      "  -5.8687606e-04  1.2303573e-03  4.5222897e-04  1.5270878e-03\n",
      "  -3.6727260e-03 -3.0614049e-04]\n",
      " [-1.8781899e-04 -3.4702761e-04 -2.0322317e-05 -3.4224652e-04\n",
      "  -4.4325300e-04 -1.1415767e-03  1.1274662e-04  5.7519245e-04\n",
      "   1.1694311e-04  7.0931134e-04]]\n",
      "[[ 1.55777712e+01 -1.05091429e+00  9.74276304e-01 -1.42321882e+01\n",
      "   5.99148512e+00  2.02531338e+00 -1.14337492e+01  1.73737488e+01\n",
      "  -6.27120638e+00 -3.14125824e+00]\n",
      " [ 1.13881841e-01 -1.24881916e-01  1.47017851e-01  3.90907042e-02\n",
      "  -2.54981425e-02 -2.25878507e-02 -8.38336051e-02 -3.10666151e-02\n",
      "  -1.92982569e-01  5.66481380e-03]\n",
      " [-2.36634836e-01 -1.71446967e+00 -2.04065472e-01 -2.04369950e+00\n",
      "  -1.53748310e+00 -4.64286995e+00  1.42189160e-01  2.47772884e+00\n",
      "  -9.40964222e-01  3.68809652e+00]]\n"
     ]
    }
   ],
   "source": [
    "args = {\n",
    "    \"output_dir\": \"\", # ENTER THE OUTPUT FROM THE PREVIOUS CELL HERE\n",
    "    \"nitems\": NITEMS,\n",
    "    \"nusers\": NUSERS,\n",
    "    \"n_embeds\": 10\n",
    "  }\n",
    "\n",
    "user_embeddings, item_embeddings = get_factors(args)\n",
    "print(user_embeddings[:3])\n",
    "print(item_embeddings[:3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can visualize the embedding vectors using dimensional reduction techniques such as PCA."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7fc3ea66e4d0>"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "pca = PCA(n_components = 3)\n",
    "pca.fit(user_embeddings)\n",
    "# TODO 3: Apply the mapping (transform) to user embeddings\n",
    "user_embeddings_pca = pca.transform(user_embeddings)\n",
    "\n",
    "fig = plt.figure(figsize = (8,8))\n",
    "ax = fig.add_subplot(111, projection = \"3d\")\n",
    "xs, ys, zs = user_embeddings_pca[::150].T\n",
    "ax.scatter(xs, ys, zs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## OPTIONAL: Run on Cloud"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Copying file://data/collab_mapped.csv [Content-Type=text/csv]...\n",
      "Copying file://data/collab_raw.csv [Content-Type=text/csv]...                   \n",
      "Copying file://data/items.csv [Content-Type=text/csv]...                        \n",
      "Copying file://data/items_for_user [Content-Type=application/octet-stream]...   \n",
      "Copying file://data/users_for_item [Content-Type=application/octet-stream]...   \n",
      "Copying file://data/users.csv [Content-Type=text/csv]...                        \n",
      "- [6/6 files][ 35.7 MiB/ 35.7 MiB] 100% Done                                    \n",
      "Operation completed over 6 objects/35.7 MiB.                                     \n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "gcloud storage cp data/* gs://${BUCKET}/wals/data"   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gs://qwiklabs-gcp-01-7f6e984e70dc/wals/model_trained us-central1 wals_220516_174236\n",
      "jobId: wals_220516_174236\n",
      "state: QUEUED\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "CommandException: 1 files/objects could not be removed.\n",
      "Job [wals_220516_174236] submitted successfully.\n",
      "Your job is still active. You may view the status of your job with the command\n",
      "\n",
      "  $ gcloud ai-platform jobs describe wals_220516_174236\n",
      "\n",
      "or continue streaming the logs with the command\n",
      "\n",
      "  $ gcloud ai-platform jobs stream-logs wals_220516_174236\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "OUTDIR=gs://${BUCKET}/wals/model_trained\n",
    "JOBNAME=wals_$(date -u +%y%m%d_%H%M%S)\n",
    "echo $OUTDIR $REGION $JOBNAME\n",
    "gcloud storage rm --recursive --continue-on-error $OUTDIR\n",    "gcloud ai-platform jobs submit training $JOBNAME \\\n",
    "    --region=$REGION \\\n",
    "    --module-name=walsmodel.task \\\n",
    "    --package-path=${PWD}/walsmodel \\\n",
    "    --job-dir=$OUTDIR \\\n",
    "    --staging-bucket=gs://$BUCKET \\\n",
    "    --scale-tier=BASIC_GPU \\\n",
    "    --runtime-version=$TFVERSION \\\n",
    "    -- \\\n",
    "    --output_dir=$OUTDIR \\\n",
    "    --input_path=gs://${BUCKET}/wals/data \\\n",
    "    --num_epochs=10 --nitems=${NITEMS} --nusers=${NUSERS} "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "This will take <b>10 minutes</b> to complete. Rerun the above command until the jobs gets submitted."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "<pre>\n",
    "# Copyright 2022 Google Inc. All Rights Reserved.\n",
    "#\n",
    "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "#      http://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License.\n",
    "</pre>"
   ]
  }
 ],
 "metadata": {
  "environment": {
   "kernel": "python3",
   "name": "tf-gpu.1-15.m91",
   "type": "gcloud",
   "uri": "gcr.io/deeplearning-platform-release/tf-gpu.1-15:m91"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
